package ink.yuanchu.picachoframework.log;

import ink.yuanchu.picachoframework.util.JwtTokenUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;


/**
 * Created with IntelliJ IDEA.
 * 控制层日志处理
 * @author ziyuan
 * @Date: 2021/03/11/10:57
 * @Description:
 */
@Aspect
@Component
public class WebLogAspect {

    private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    @Pointcut("execution(public * ink.yuanchu.picachoframework.controller.*.*(..))")
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable{
        //接收到请求，记录请求内容
        ServletRequestAttributes attributes =  (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //取出token
        String token = request.getHeader(JwtTokenUtil.TOKEN_HEADER);
        //去掉前缀 获取Token字符串  解析出username
        String username = JwtTokenUtil.getUsername(token.replace(JwtTokenUtil.TOKEN_PREFIX, ""));

        //记录请求内容
        logger.info("USER:"+username);
        logger.info("URL:"+request.getRequestURL().toString());
        logger.info("HTTP_METHOD:"+request.getMethod());
        logger.info("IP:"+request.getRemoteAddr());
        Enumeration<String> attributeNames = request.getParameterNames();
        while(attributeNames.hasMoreElements()){
            String s = attributeNames.nextElement();
            logger.info("name:{}，value:{}",s,request.getParameter(s));
        }
    }

    @AfterReturning(returning = "obj",pointcut = "webLog()")
    public void doAfterReturning(Object obj) throws Throwable{
        //处理完请求，返回内容
        logger.info("RESPONSE:"+obj);
    }

}
